var express = require('express');
var router = express.Router();
// const { UserModel } = require("../models");
const jwtToken = require("./jwt.js");
// 调用service中的方法
let userService = require("../services/userService");
/**
 * 读取所有用户信息
 */
router.get('/', async function (req, res, next) {
  //这里的代码是操作数据库的代码
  // let result = await UserModel.find();
  // res.send(result);

  //在路由里面，我们调用的就是service中封装好的函数
  let result = await userService.getAllUsers();

  res.send(result);
});

/**
 * 获取用户分页显示信息
 * @group User - 用户相关操作 //分组
 * @route GET /users/list //路由请求方式，与地址
 * @param {string} key.query - 条件查询的键 //传递的值 query表示通过url地址传递
 * @param {string} val.query - 条件查询的值 //传递的值
 * @param {string} page.query.required - 当前页码 //传递的值 required表示该值必须传递
 * @param {string} limit.query.required - 每页显示数量
 * @security JWT
 * @returns {object} 10 - 默认每页显示10条数据 //返回数据的类型
 */
router.get('/list', async function(req, res, next) {
  console.log("=======");
  console.log(req);
  // console.log(req.headers.authorization);

  //获取cookie信息
  // let token = req.cookies.token;
  // console.log(token);
  // if (!token) { 
  //   res.send({ data: null, count: 0, code: -2, msg: "你没有权限查看用户信息" });
  //   return;
  // }
  
  let { key, val, page, limit } = req.query;

  let filter = null;
  //如果val有值，证明前端页面有传递查询数据
  if (val !== null || val !== "") {
    if (key === "name") {
      filter = { "name": { $regex: new RegExp(val) } }
    }
    else if (key === "age") { 
      filter = { "age":val}
    }
  }

  console.log(filter)
  
  //把数据传递到service，通过service层封装处理数据
  //再传递回来
  let result = await userService.list(filter, page, limit);

  // console.log(result);
  res.send(result);
});

//restful的请求方式
//实际上html中，请求方式只有get和post
//但是我们要进行的操作，有增删改查(CRUD)
//为了更加明显的知道，到底实在进行什么样子的操作
//所以在请求方式上就直接进行的区分
//一般情况下 ，请求方式你会看到下面几种
//get  --- 查询
//post --- 新增(或者其他的对安全性要求比较高的查询，比如登录)
//delete --- 删除
//put --- 修改

//删除操作

/**
 * 删除用户
 * @group User - 用户相关操作
 * @route DELETE /users/del/{id} //重点是{}
 * @param {string} id.path.required - restful通过路径传递的id值 //path表示通过路径传值
 * @security JWT
 * @returns {object} - code=0表示成功 code=其他表示失败
 */
router.delete("/del/:id", async (req, res) => {
  let id = req.params.id;
  let result = await userService.deleteById(id);
  console.log(result);
  res.send(result);
});

router.post("/add", async (req, res) => { 
  let result = await userService.add(req.body);
  res.send(result);
})

router.get('/get/:id', function(req, res, next) {
  res.send('返回id用户信息' + req.params.id);
});

//验证码
const svgCaptcha = require('svg-captcha');

router.get('/captcha',(req, res)=>{
  const cap = svgCaptcha.create({
          // 翻转颜色
          inverse: false,
          // 字体大小
          fontSize: 36,
          // 噪声线条数
          noise: 3,
          // 宽度
          width: 80,
          // 高度
          height: 30,
          // 去掉容易混淆的字母数字
          ignoreChars: '0o1il'
      });
  req.session.captcha = cap.text; // session 存储验证码数值
  console.log(req.session)
  res.type('svg'); // 响应的类型
  res.send(cap.data)
})

router.post("/login", async (req, res) => {

  let { loginId, loginPwd, captcha } = req.body;
  // console.log("----" + loginId, loginPwd, captcha);
  // console.log(captcha,req.session.captcha);
  if (captcha && captcha.toLowerCase() !== req.session.captcha.toLowerCase()) { 
    res.send({code:-2,msg:"验证码不正确!"});
    return 
  }
  let result = await userService.login(loginId, loginPwd);
  //cookie 
  //cookie令牌保存用户的_id result.data._id
  // console.log(result);
  // 原始的写法，通过response响应头发送cookie
  //res.header("set-cookie",`token=${result.data._id};path=/;domain=127.0.0.1;max-age=3600;`)
  
  // COOKIE中间件发送cookie响应头
  // res.cookie("token", result.data._id, {
  //   path: "/",
  //   domain: "127.0.0.1",
  //   maxAge: 1000 * 20 //毫秒数
  // })
  // 保存session
  // if (result.code === 0) {
  //   req.session.loginUser = result.data
  // }

  if (result.code === 0) { 
    let token = jwtToken.publishJWT(res, { id: result.data._id, loginId: result.data.loginId, name:result.data.name }, "1h");
    console.log(token);
  }

  res.send(result);
});

router.get("/whoami", async(req, res) => { 
  //判断cookie
  // let token = req.cookies.token;
  // if (!token) {
  //   res.send({ data: null, code: -2, msg: "你还没有登录或者登录过期,请先登录" })
  // }
  // else {
  //   let result = await userService.findOne(token);
  //   res.send(result);
  // }

  // let loginUser = req.session.loginUser;
  // if (!loginUser) {
  //   res.send({ data: null, code: -2, msg: "你还没有登录或者登录过期,请先登录" })
  // }
  // else {
  //   // let result = await userService.findOne(token);
  //   res.send({code:0,msg:"成功",data:loginUser});
  // }

  let result = jwtToken.verifyJWT(req);
  if (!result) {
    res.send({ data: null, code: -2, msg: "你还没有登录或者登录过期,请先登录" })
  }
  else {
    res.send({code:0,msg:"成功",data:result});
  }
})

module.exports = router;
